#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
配置管理器模块
负责加载、保存和管理应用程序配置
"""

import os
import json
import logging
from pathlib import Path

class ConfigManager:
    """配置管理器类"""
    
    def __init__(self):
        """初始化配置管理器"""
        # 获取配置文件路径
        self.config_dir = os.path.abspath(os.path.join(
            os.path.dirname(__file__), '..', 'configs'))
        self.config_file = os.path.join(self.config_dir, 'config.json')
        
        # 确保配置目录存在
        Path(self.config_dir).mkdir(parents=True, exist_ok=True)
        
        # 默认配置
        self.default_config = {
            'app': {
                'theme': 'light',
                'language': 'zh_CN',
                'auto_save': True,
                'save_interval': 60,
            },
            'excel': {
                'default_sheet': 'Sheet1',
                'encoding': 'utf-8',
                'date_format': 'yyyy-MM-dd',
                'decimal_places': 2,
            },
            'paths': {
                'last_input_dir': '',
                'last_output_dir': '',
                'template_dir': '',
            },
            'processing': {
                'max_workers': 4,
                'batch_size': 1000,
            },
            'logging': {
                'level': 'INFO',
                'log_to_file': True,
                'log_file': os.path.join(self.config_dir, '..', 'logs', 'app.log'),
            }
        }
    
    def load_config(self):
        """加载配置文件
        
        Returns:
            dict: 配置字典
        """
        try:
            if os.path.exists(self.config_file):
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    config = json.load(f)
                # 合并默认配置和用户配置，确保所有必需的键都存在
                return self._merge_configs(self.default_config, config)
            else:
                # 如果配置文件不存在，创建默认配置文件
                self.save_config(self.default_config)
                return self.default_config
        except Exception as e:
            logging.error(f"加载配置文件失败: {str(e)}")
            return self.default_config
    
    def save_config(self, config):
        """保存配置到文件
        
        Args:
            config (dict): 要保存的配置字典
        """
        try:
            # 合并默认配置和用户配置
            merged_config = self._merge_configs(self.default_config, config)
            
            # 保存配置文件
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(merged_config, f, ensure_ascii=False, indent=2)
            
            return True
        except Exception as e:
            logging.error(f"保存配置文件失败: {str(e)}")
            return False
    
    def _merge_configs(self, default, user):
        """递归合并两个配置字典
        
        Args:
            default (dict): 默认配置字典
            user (dict): 用户配置字典
            
        Returns:
            dict: 合并后的配置字典
        """
        merged = default.copy()
        
        for key, value in user.items():
            if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
                merged[key] = self._merge_configs(merged[key], value)
            else:
                merged[key] = value
        
        return merged
    
    def get_config_value(self, config, key_path, default=None):
        """从配置字典中获取指定路径的值
        
        Args:
            config (dict): 配置字典
            key_path (str): 键路径，如 'app.theme'
            default: 默认值，如果键不存在
            
        Returns:
            配置值或默认值
        """
        keys = key_path.split('.')
        current = config
        
        try:
            for key in keys:
                current = current[key]
            return current
        except (KeyError, TypeError):
            return default

# 创建配置管理器实例
config_manager = ConfigManager()